首页 理论教育 零点起步—嵌入式Linux编程入门与开发实例

零点起步—嵌入式Linux编程入门与开发实例

时间:2023-10-31 理论教育 版权反馈
【摘要】:线程是一些相关指令的离散序列。此后,主线程会为执行各种不同的任务决定是分别创建其他线程,还是由主线程独立承担。目前,线程由用户线程和内核线程两种方法实现。为了防止可能的阻塞,多线程化是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责。允许多线程的程序运行时不需要特定的内核支持,内核不需要直接对用户线程进程调度。

零点起步—嵌入式Linux编程入门与开发实例

线程是一些相关指令的离散序列。线程与其他指令序列的执行相互独立,每个程序至少包括一个线程,即主线程。主线程负责程序的初始化工作,并且执行初始指令。此后,主线程会为执行各种不同的任务决定是分别创建其他线程,还是由主线程独立承担。不管哪种情况,每个程序至少都包含一个线程,并且每个线程都会维护自己当前的机器状态。目前,线程由用户线程和内核线程两种方法实现。

1.内核线程

Linux内核可以被看做是一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行。为了防止可能的阻塞,多线程化是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功能模块,如kswapd和kflushd等,这在处理异步事件,如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核称为多线程内核(Multi-Threads Kernel)。内核线程的调度由内核负责。一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。

内核线程(Thread)或称守护进程(Daemon),在操作系统中占据相当大的比例。当Linux操作系统启动后,尤其是XWindow也启动后,可以用“ps-ef”命令查看系统中的进程,这时会发现很多以“d”结尾的进程名。确切说,名称显示里面加“[]”的,这些进程就是内核线程。系统的启动顺序是:硬件->内核->用户态进程,pid的分配是一个往前循环的过程,所以,随系统启动的内核线程的pid往往很小。

2.用户线程

用户线程在用户空间中实现。允许多线程的程序运行时不需要特定的内核支持,内核不需要直接对用户线程进程调度。内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。(www.xing528.com)

由于Linux内核没有轻量级进程(线程)的概念,因此不能独立地对用户线程进行调度,而是由一个线程运行库来组织线程的调度,其主要工作在于在各个线程的栈之间调度。如果一个进程中的某一个线程调用了一个阻塞的系统调用,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会。因此,Linux使用了异步I/O机制。

用户线程的优点如下:

●某些线程操作的系统消耗大大减少。比如,对属于同一进程的线程之间进行调度切换时,不需要调用系统调用,因此将减少额外的消耗。一个进程往往可以启动上千个线程。

●用户线程的实现方式可以被定制或修改,以适应特殊应用的要求。它对于多媒体实时过程等尤其有用。另外,用户线程可以比内核线程实现方法默认情况支持更多的线程。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈