(1)线程(LWP)   可使用命令查看指定线程的LWP号:  ps  -Lf pid

1)light weigh process(轻量级进程),本质上仍然是进程

进程:独立的地址空间,拥有PCB,最小分配资源单位,内存分配资源以进程为标准。

线程:没有独立的地址空间(共享),拥有PCB,最小的执行单位,CPU分配时间轮片是以线程为标准。

            2)线程和进程的联系和区别

1>线程也有PCB,创建线程使用的底层函数和进程一样,都是clone。

2>从内核里看进程和线程都是一样的,都有各自不同的PCB,但PCB中指向内存的三级页表是相同的(类似于指向相同内存的指针,指针不同,但是内存相同)。

三级映射:进程PCB--->页目录(4kb)-->页表---->物理页面---->内存单元

3>进程可以退变成线程。

4>线程可以看做寄存器和栈的集合

3)线程资源和优缺点

1)共享资源

文件描述符  信号处理方式   工作目录  用户id和组id      内存地址空间(除栈空间和errno变量)

2)独享资源

线程id   处理器现场和栈指针(内核栈)和独立的栈空间(用户栈 )  errno变量    信号屏蔽字  调度优先级

3)线程优缺点

优点:提高程序并发性  开销小(针对于进程)  数据通信共享数据方便(进程:IPC通信)

缺点:使用库函数,不稳定   调试编译困难,gdb不支持(出现在gdb之后)   对信号支持不好

(2)线程控制原语

1)获取线程id:  pthread_t pthread_self(void);                     ---->对应进程getpid()

pthread_t  pthread_self(void);            返回值:成功 0     失败  无

pthread_t:为linux下的无符号整数(%lu)

线程ID为进程内部,识别标志,两个进程之间线程id允许相同。

2)创建一个新线程 :pthread_create                                                --->对应进程的fork()

int pthread_create(pthread_t *thtrad,const pthread_attr_t *attr,void*(*start_routinue)(void *),void *arg);

返回值   成功:0     失败:错误号(linux环境下线程的特点:失败均返回错误号,不能使用perror,而应该使用sterror函数

参数              1:保存系统为分配的线程id

2:通常设置为NULL,表示使用线程的默认属性(可使用具体参数修改该参数)

3:函数指针,指向线程主函数(线程体)。函数运行结束,则线程结束。

4:主函数执行期间所使用的参数。

使用pthread_create循环创建多个线程,每个线程打印自己是第几个被创造的线程

1>实现和结果

直接将整形转化为指针类型,如果是32位的操作系统,直接转换。如果是64位的操作系统,则是小端转大端问题,前头补零,数据不变化。

2>代码修改:(换成取地址,符合我们正常的理解,结果有问题

  如果是取地址的话,则线程去i的时候可能其他的线程也来了,此时两个线程公用全局变量,使得两个i值混乱。可以直接利用两个线程之间不共享栈的特点,直接采用值传递,而不是址传递。

           3)单个进程退出:pthread_exit函数

void  pthread_exit(void* retval)  参数:retval 表示线程退出状态,通常传NULL

在多线程中 exit ,return ,pthread_exit的区别:

 exit:进程中的所有线程退出,在线程中应该禁止使用exit.

                 return:返回到调用者那里,继续执行下一步程序。

                pthread_exit:退出单个线程

          结论:多线程环境中,应该尽量不用或者少用exit函数,取而代之用pthread_exit函数。pthread_exit或者return返回的指针所指向的内存必须是全局或者malloc分配的(不同线程不共享栈)

          4)阻塞等待线程退出,获取线程退出状态 :pthread_join                         ---->对应进程中的waitpid()

int  pthread_join(pthread_t thread,void **retval);     成功:0  失败:错误号

参数:线程id  ,retavl:储存线程结束状态。

5)线程分离:pthread_detach(常用与网路和多线程服务器)

int   pthread_detach(pthread_t thread)       成功:0  失败:错误号

线程分离:线程主动与主控线程断开联系。线程结束后,其退出状态不由其他线程获取,而是自己主动释放(不会产生僵尸进程)(也可以通过pthread_create 通过设置参数2实现线程分离)

                使用了线程分离的线程不能够在使用pthread_join,这样调用返回EINVAL错误

6)杀死(取消)线程:pthread_cancel函数                    --->进程的kill函数

int pthread_cancel(pthread_t thread);           成功:0  失败:错误号

注意:线程的取消和杀死并不是实时的,而是有一定的延时性,需要等待线程到底某个取消点或者检查点(通常是系统调用,可通过 man 7 pthread查看取消点列表,也可以通过pthread_testcancel()函数来自行设置一个取消点)

当我们对一个已经取消的线程使用pthread_join时,返回值是-1.

         终止线程的方式:

1>线程主函数return 返回,不适用于主控线程。

2>一个线程调用pthread_cancel终止同一个进程中的另一个线程。

3>线程可以调用pthread_exit终止自己。

linux操作系统之线程相关推荐

  1. linux操作系统之线程同步及互斥量

    (1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回.同时其它线程为保证数据的一致性,不能调用该功能. 2)多个控制流共同操作一个共享资源的时候,都需要同 ...

  2. Linux操作系统下软件的安装方法大全

    一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...

  3. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  4. Linux 操作系统原理 — 用户进程、用户线程、内核线程、轻量级进程、协程的区别与联系

    目录 文章目录 目录 面向线程设计的 Linux 操作系统 用户进程(User Process) 用户进程的创建与销毁 进程的生命周期状态机 用户进程的调度 用户进程间通信 用户进程的子进程 用户线程 ...

  5. 吉林大学操作系统上机(实验一:Linux进程与线程通讯)

    前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...

  6. Linux进程与线程的区别 详细总结(面试经验总结)

    首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...

  7. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  8. Linux 操作系统原理 — 多处理器架构

    目录 文章目录 目录 计算平台体系结构 单核 CPU 和超线程 多核架构的出现 SMP 对称多处理结构 NUMA 非统一内存访问结构 MPP 大规模并行处理结构 Linux 上的 NUMA 基本对象概 ...

  9. Linux 操作系统原理 — 内存 — 基于 MMU 硬件单元的虚/实地址映射技术

    目录 文章目录 目录 前文列表 物理地址与虚拟地址 内存空间的组织方式 虚拟地址空间的编址 内核态地址空间 用户态地址空间 内-外存空间的交换与虚拟存储空间之间的映射关系 缺页异常 前文列表 < ...

最新文章

  1. Powershell指令集_1
  2. Java开发知识之Java面相对象
  3. 【今日CS 视觉论文速览】Thu, 13 Dec 2018
  4. 【mac apache】了解自带的apache
  5. Java 集合深入理解(15):AbstractMap
  6. hadoop日常维护之问题解决01
  7. Angr安装与使用之使用篇(三)
  8. cmd指令-快捷查看电脑ip地址
  9. 浏览器插件:插件推荐
  10. sem与seo的区别与联系
  11. deepin升级Linux内核,深度 deepin 20.1 (1005)系统开启内测:升级至 Linux Kernel 5.8 稳定内核...
  12. 记录每天学习的新知识: Android 前台服务
  13. 做读书笔记好用的软件分享
  14. DFS求岛屿最大面积
  15. 计算机设备统计报告,2017年1-12月通信设备、计算机及其他电子设备制造业增加值统计分析...
  16. 2021年服创国赛参赛小结
  17. 【项目】前端实习——知识库项目总结
  18. 拓扑排序 POJ - 3687反向图跑字典序(重边)
  19. 【“笨办法”学Python】42.对象、类及从属关系——类即是对象
  20. 简易音乐播放器(Android Studio)

热门文章

  1. js笔记(八)ES6
  2. Tmux: 打造精致与实用并存的终端
  3. 多线程爬取新闻标题和链接
  4. Python 离线 安装requests第三方库
  5. java字符串 删除指定字符的那些事
  6. Windows 自启动总结《转》
  7. 财务部门:你需要多长时间才能够回答老板的这些问题?
  8. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  9. 为什么django+mongo在windows上session能够获取到,同样的程序在linux上就会报session的变量错误,keyerror?...
  10. .NET系统架构改造的经验和教训