【Linux】第二章 Linux进程与线程(下)

4. Linux内核级线程与用户级线程

POSIX线程调度是一个混合模型,既支持用户级也支持内核级的线程。在创建线程时对contentionscope属性可设置为:

  • PTHREAD_SCOPE_PROCESS。它表示新创建的线程与它所在的进程中的其他线程竞争处理器资源,等同用户级线程。
  • PTHREAD_SCOPE_SYSTEM。说明新创建的线程就像内核级线程一样在全系统的范围内竞争处理器资源。

(1) 内核级线程

  • 线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。
  • 这些线程可以在全系统内进行资源的竞争。
  • 内核空间内为每一个内核级线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。
  • 内核切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用SMP,即利用多核CPU。

在一定程度上类似于进程,只是创建、调度的开销要比进程小。有人做过一个实验,创建线程和进程所花时间开销之比为1:10。内核级线程创建代码如下:pthread_attr_t attr;pthread_attr_init(&attr);// 设置内核级的线程,以获取较高的响应速度pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);//创建线程ret = pthread_create(&iAcceptThreadId, &attr,AcceptThread, NULL);

(2) 用户级线程

优点

  • 内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。
  • 用户级线程的切换发生在用户空间,这样的线程切换至少比陷入内核要快一个数量级(不需要陷入内核、不需要上下文切换、不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷)。创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多, 因为保存线程状态的过程和调用程序都只是本地过程。
  • 内核并不能看到用户线程。——>重要的区别
  • 用户级线程有比较好的可扩展性,线程能够利用的表空间和堆栈空间比内核级线程多,这是因为在内核空间中内核线程需要一些固定的表格空间和堆栈空间,如果内核线程的数量非常大,就会出现问题。
  • 可以在不支持线程的操作系统中实现。
  • 允许每个进程定制自己的调度算法,线程管理比较灵活。这就是必须自己写管理程序,与内核线程的区别。
  • 线程的调度不需要内核直接参与,控制简单。

缺点:

  • 一个线程阻塞,会阻塞该进程中其他所有的线程。
  • 如果一个线程开始运行,那么该进程中其他线程就不能运行,除非第一个线程自动放弃CPU。因为在一个单独的进程内部,没有时钟中断,所以不能用轮转调度(轮流)的方式调度线程,不能很好的利用多核CPU。

用户级线程创建代码如下:pthread_attr_t attr;pthread_attr_init(&attr);// 设置用户级的线程pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS);//创建线程ret = pthread_create(&iAcceptThreadId, &attr,AcceptThread, NULL); 但目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM,即,Linux仅提供了内核级线程。运行下列程序,可观察运行结果。程序创建了4个用户级线程(0-3)和4个人内核级线程(4-8),但从运行结果来看,每个线程运行的时间大致相等。如果Linux实现了用户级线程,线程(0-3)执行需要更多的时间。可见在Linux中没有实现用户级线程。

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <unistd.h>

#include <time.h>

int n;  //共享变量,对共享变量应互斥使用,为简化设计,

// 本程序不考虑互斥问题。(省略互斥机制),

void *fun(void *id) {

   int i, j, sum=0, num=0;

   time_t t;

   time(&t);

   printf("T%s:Start...\n",(char*)id);

   for (i=0; i<100 ; i++ ) {

       for(j=0; j<10000000; j++) {

           sum += 1;

       }

   }

   n++;

   printf("T%s, time:%ld\n",(char *)id, time(NULL)-t);

}

char tid[8][2];

int main(void) {

   pthread_t t[8];

   int i;

   pthread_attr_t attr;

   pthread_attr_init(&attr);

   // 设置用户级线程。

   pthread_attr_setscope(&attr,PTHREAD_SCOPE_PROCESS);

   for (i=0; i < 4; i++) {

       tid[i][0] = 48+i;

       pthread_create(&t[i],  &attr, fun, &tid[i]);

   }

   // 设置内核级的线程,以获取较高的响应速度

   pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);

   for (i=4; i < 8; i++) {

      tid[i][0] = 48+i;

      pthread_create(&t[i],  &attr, fun,tid[i]);

   }

   while(n!=8);

   return 0;

}
gcc test2.c -o test2 -lpthread

执行结果:

xianchen$ ./test2
T1:Start...
T5:Start...
T2:Start...
T7:Start...
T0:Start...
T4:Start...
T6:Start...
T3:Start...
T2, time:2
T5, time:3
T6, time:3
T3, time:3
T4, time:3
T7, time:3
T1, time:3
T0, time:3
T0, time:3

原文地址:https://www.cnblogs.com/vx-cg248805770/p/11653265.html

时间: 2024-10-15 11:53:33

【Linux】第二章 Linux进程与线程(下)的相关文章

操作系统_第二章_进程与线程

2018-06-30 1.进程:对正在运行的程序的一个抽象 2.一个进程就是一个正在执行的程序的实例 3.快速的切换称为:多道程序设计 4.一个进程是某种类型的一个活动,它有程序,输入,输出,以及状态 5..四种主要的事件会导致进程的创建 系统初始化 正在运行的程序执行了创建进程的系统调用 用户请求创建一个新进程 一个批处理作业的初试化 6.停留在后台进程的称为守护进程 7.shell中键入sort就可以创建进程了 8.内存一般使用写时复制的方法进行内存共享 9.进程的终止 正常退出 出错退出

Linux中四种进程或线程同步互斥控制方法

原文地址:http://blog.itpub.net/10697500/viewspace-612045/ 一.Linux中 四种进程或线程同步互斥的控制方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始. 二.临界区(Critical Section) 保证在某一时刻只有一个线程

linux 第二章系统设置以及基本操作

享受生活  热爱挑战                                                                                        明远分享                       linux  第二章系统设置以及基本操作 每章一段话     我们真正的痛苦,来自于因耽误所产生的焦虑,来自于最后时刻所完成的项目质量低劣而产生的负罪恶感,还来自由于失去人生中许多的机会产生的深深悔恨. 目标  1.学会图形化界面和命令行界面的各种切

第二章 Linux文件系统和文本编辑器

用户分为三类: 1.root用户 2.虚拟用户:不具有登录系统的能力,一般系统自身拥有,比如bin,daemon,ftp,mail 3.普通用户 useradd: -g:指定用户私有组 -G:添加附加组 -d:指定用户家目录,如果不存在可以结合-m创建 -m:如果家目录不存在则自动创建 -u:指定UID,和-o一起可以重复使用其他用户的UID,必须>=100 注意useradd的用户没有密码还不能登录 usermod:修改用户账号 -d[directory]:改变用户登录时的目录,注意不是改变家

从零开始的linux 第二章

从零开始的linux 第二章 呼~~,大家早上好~(伸懒腰) 又到了一周一次的写博客时间了,不知不觉又过去一周了呢~小编也越来越懒了(超级害羞脸)~~唉??怎么办呢??(小编勉为其难的说)要不....要不再水一帖吧.... ←老师和(超)善(凶)的眼神 不不不不...不要激动...小编...小编我..开...开玩笑的...开玩笑的... 唉~~小编上一次写的文章被批评了,因为排版一塌糊涂..QAQ...小编为了让大家学的开心并且学的轻松,图片太乱了...缺点被指出之后,小编是要去改的说...可是

Android艺术开发探索——第二章:IPC机制(下)

Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvider ContentProvider是Android中提供的专门用来不同应用之间数据共享的方式,从这一点来看,他天生就是适合进程间通信,和Messenger一样,ContentProvider的底层实现同样也是Binder,由此可见,Binder在Android系统中是何等的重要,虽然Conten

如何在 Linux 中统计一个进程的线程数

编译自:http://ask.xmodulo.com/number-of-threads-process-linux.html作者: Dan Nanni原创:LCTT https://linux.cn/article-6240-1.html译者: strugglingyouth本文地址:https://linux.cn/article-6240-1.html 2015-9-17 10:29    收藏: 5 问题: 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会有多少线程

【Linux】程序、进程和线程的区别

程序.进程和线程的区别 程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行.进程则是运行着的程序,是操作系统执行的基本单位.线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位. ? 程序和进程的区别: ????C.C++.Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行.应用程序的运行状态称为进程.进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的资源管理实体.可以从

第二章 Linux目录学习

Linux 目录结构相对windows来说更简单,Linux 目录 以 斜杠 / 为根目录,其整体结构是以/为根的树状结构. 使用 tree -L 1 查看1级目录结构 /bin 常用的二进制命令目录.比如(ls,cp,mkdir,cut等命令),和/usr/bin类似 /boot 目录linux内核及引导系统程序所需要的文件目录 /dev  设备文件目录,比如 声卡,磁盘信息等... /etc 常用系统及二进制安装包配置文件默认路径和服务器启动命令目录 /home 普通用户的家目录默认存放目录