首页 > 知识库 > 正文

Linux内核是如何创建线程的,它与windows有哪些不同?

linux多线程及线程同步和windows的多线程之间的异同并不是所有的程序都必须采用多e5a48de588b63231313335323631343130323136353331333365656531线程,有时候采用多线程性能还不如单线程。采用多线程的好处如下:(1)多线程之间采用相同的地址空间,共享大部分的数据,和多进程相比,代价比较节俭,而启动新的进程必须分配给它独立的地址空间,需要数据表来维护代码段,数据段和堆栈段等等。(2)对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,费时而且不方便。多线程之间可以直接共享数据,比如共享全局变量。共享全局变量要注意变量的同步性,不然容易引起灾难性的后果。(3)在多cpu的情况下,不同的线程可以运行在不同的cpu下,这样就完全并行了。在这种情况下,采用多线程比较理想。比如要做一个任务分2个步骤,为提高工作效率可以多线程技术开辟2个线程,第一个线程做第一步,第2个线程做第2步。这个时候要注意同步。因为只有第一步做完才能做第2步的工作。这时,可以采用同步技术进行线程之间的通信。针对这种情况,讲解一下多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有:(1)共享全局变量,比如上面的问题,第一步要向第2步传递收据,可以共享全局变量,让两个线程之间传递数据,这时主要考虑的问题就是变量的同步,因为后面的线程在对数据进行操作的时候,第一个线程又改变了数据的内容,不同步保护,后果很严重(即读回脏数据)。这种情况下,容易想到的同步方法是设置一个bool flag,比如在第2个线程还没有用完数据前,第一个线程不能写入。有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦。 这时可以多开几个缓冲区进行操作。如果是2个线程一直在跑,由于时间不一致,缓冲区迟早会溢出。在这种情况下要考虑:是不让数据写入还是让数据覆盖掉旧的数据。这时候要具体问题具体分析。即用bool变量控制同步,linux 和windows是一样的,linux多线程及线程同步和windows的多线程之间的异同并不是所有的程序都必须采用32313133353236313431303231363533e78988e69d8331333363363536多线程,有时候采用多线程性能还不如单线程。采用多线程的好处如下:(1)多线程之间采用相同的地址空间,共享大部分的数据,和多进程相比,代价比较节俭,而启动新的进程必须分配给它独立的地址空间,需要数据表来维护代码段,数据段和堆栈段等等。(2)对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,费时而且不方便。多线程之间可以直接共享数据,比如共享全局变量。共享全局变量要注意变量的同步性,不然容易引起灾难性的后果。(3)在多cpu的情况下,不同的线程可以运行在不同的cpu下,这样就完全并行了。在这种情况下,采用多线程比较理想。比如要做一个任务分2个步骤,为提高工作效率可以多线程技术开辟2个线程,第一个线程做第一步,第2个线程做第2步。这个时候要注意同步。因为只有第一步做完才能做第2步的工作。这时,可以采用同步技术进行线程之间的通信。针对这种情况,讲解一下多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有:(1)共享全局变量,比如上面的问题,第一步要向第2步传递收据,可以共享全局变量,让两个线程之间传递数据,这时主要考虑的问题就是变量的同步,因为后面的线程在对数据进行操作的时候,第一个线程又改变了数据的内容,不同步保护,后果很严重(即读回脏数据)。这种情况下,容易想到的同步方法是设置一个bool flag,比如在第2个线程还没有用完数据前,第一个线程不能写入。有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦。 这时可以多开几个缓冲区进行操作。如果是2个线程一直在跑,由于时间不一致,缓冲区迟早会溢出。在这种情况下要考虑:是不让数据写入还是让数据覆盖掉旧的数据。这时候要具体问题具体分析。即用bool变量控制同步,linux 和windows是一样的。同样针对上面的这个问题,共享全局变量同步问题。除了采用bool变量外,还有互斥量。即加锁。windows下加锁和linux下加锁是类似的。采用互斥量进行同步,要想进入那段代码,就先必须获得互斥量。windows下互斥量的函数有:createmutex()创建一个互斥量,然后就是获得互斥量waitforsingleobject()函数,用完了就释放互斥量ReleaseMutex(hMutex),当减到 0的时候 内核会才会释放其对象。下面是windows下与互斥的几个函数原型。HANDLE WINAPI CreateMutex(__in LPSECURITY_ATTRIBUTES lpMutexAttributes,__in BOOL bInitialOwner,__in LPCTSTR lpName本回答被提问者采纳,Linux的线程是共享内存空间的多个进程,windows是一个进程。windows线程之间相互作用比linux强www.shufadashi.com防采集。

其实Linux创建进程,就是创建进程运行所需的内存空间,填充描述进程的 task_struct 结构体,以及加载进程的程序而已。

Linux 内核并无专门创建线程的机制

linux下线程的实现,linux的线程编程有两个库pthread和pth,对于pthread的实现是内核方式的实现,每个线程在kernel中都有task结构与之对应,也就是说用ps命令行是可以看见多个线程,线程的调度也是由内核中的schedule进行的。 再来看看Windows的

我们之前提到,Linux并不特殊对待线程,在Linux看来,线程不过就是一种特殊的进程而已。那么,Linux是如何创建线程的呢?

转载自fychit创意空间 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他们之间

线程机制是大多数现代编程语言都会提供的机制,该机制允许在同一进程的共享内存地址空间运行一组“特殊的进程(即线程)”。这些线程不仅共享同一段内存空间,还可以共享已经打开的文件,统计量等其他资源。线程机制支持程序并发运行,在多处理器核心的系统上,该并发机制能够实现多条线程同时运行。

在WINDOS里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲, WINDOS的多进程与Linux并无多大的区别,在WINDOS里的线程才相当于Linux的进程,是一个实际正在执行的代码。但是,WINDOS里同一个进程里各个线程之间是共

Linux 管理线程的方式不同于其他一些经典操作系统,Linux 并没有线程的概念,它把线程当作进程的一个子集来管理。因此,Linux 内核并未为线程提供额外调度算法,也没有提供额外的数据结构用于描述和存储线程。

1、windows里的进程/线程是继承自OS/2的。在windows里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲,windows的多进程与Linux并无多大的区别,在windows里的线程才相当于Linux的进程,是一个实际正在执行

就像进程一样,Linux 使用 task_struct 结构体描述和记录线程,每个线程都有唯一属于自己的 task_struct 结构。从这个角度来看,线程就是一个普通的进程,只不过线程可能和其他进程共享一些资源而已。

1.头文件 #include //wake_up_process() #include //kthread_create()、kthread_run() #include //IS_ERR()、PTR_ERR() 2.实现 2.1创建线程 在模块初始化时,可以进行线程的创建。使用下面的函数和宏定义: struct task_struct *kthread_create(

以 Windows 为代表的一些操作系统提供了专门用于创建线程的机制,在这些系统中,线程常常被称作“轻量级进程”,因为相对于进程而言,线程耗费的资源较少,能够较为迅速的创建和投入运行。

但是对于 Linux 而言,线程不过是进程之间共享资源的一种手段罢了。那么是不是 Linux 中的线程比 Windows 中的线程更加“重量级”呢?也不是,因为 Linux 中的进程本身就很轻量级,Linux 创建进程所需时间,并不比 Windows 创建线程所需时间多多少。

从C语言代码层面来看,假设某个进程包含 4 个线程,以 Windows 为代表的一些操作系统一般会有一个包含指向 4 个不同线程的指针的进程描述符,负责描述地址空间、打开的文件等共享资源,而线程本身再去描述自己独占的资源。

与之对应的,Linux 的做法就高雅许多,它仅需为这 4 个线程创建 4 个 task_struct 结构体,然后在 task_struct 中指定它们共享的资源就可以了。

创建线程

看了我最近几篇文章的读者应该已经明白,Linux 内核中的线程其实就是进程,因此线程的创建与进程的创建过程是类似的,从C语言源代码层面看,基本上也是通过 fork() 函数和 exec() 函数族实现的。只不过在调用 clone() 函数时需要传递一个参数用于描述共享资源,例如:

上面这行C语言代码和调用 fork() 函数的结果差不多,只不过输入的几个参数标志位说明了子进程与父进程共享一些资源:地址空间、文件系统、打开的文件、信号处理程序。

对比一下,fork() 基本上就相当于 clone(SIGCHLD, 0),这也是 fork() 函数创建的子进程之后不再与父进程共享资源的原因。

关于 clone() 函数的参数标志位,可以在Linux中输入 man 命令查看。

Linux 内核线程

就像用户空间的C语言程序开发一样,Linux 内核也经常需要在后台处理数据,这时就需要借助内核线程了。Linux 的内核线程一般不会独立的地址空间,它们只在内核空间运行,不会切换到用户空间。不过调度是和普通进程一样的,可以被调度和抢占。

Linux 创建内核线程由 kthread_create() 函数实现,它的C语言源代码如下,请看:

可见,kthread_create() 函数的C语言代码并不长,而且也可以看出,Linux 内核线程是通过 kthread_create_info 结构体描述的,它的定义C语言代码如下,可见,内核线程的描述和存储也是包含 task_struct 结构体的:

kthread_create() 函数创建名为 namefmt 的线程,不过线程被创建后是处于不可运行状态的,我们可以通过 wake_up_process() 函数唤醒它。当然,也可以通过 kthread_run() 方法实现这一过程,相关的C语言代码如下,请看:

其实就是将 kthread_create() 函数和 wake_up_process() 函数组合到一起而已。Linux 的内核线程被启动后,会一直运行到调用 do_exit() 退出。我们也可以调用 kthread_stop() 函数提前结束它,相关的C语言代码如下,请看:

kthread_stop() 函数接收的参数为 kthread_create() 函数创建的结构体的 task_struct 成员。从C语言代码可以看出,kthread_stop() 其实也是会调用 wake_up_process() 函数唤醒线程的,它在唤醒线程后,会等待线程函数退出,并不会调用 threadfn() 函数。

这里需要注意,如果创建的线程函数 threadfn() 调用了 do_exit() 函数,最好就不要再调用 kthread_stop() 函数了。

kthread_stop() 函数等待线程退出是通过 wait_for_completion() 函数实现的,相关的C语言代码如下,请看:

稍稍跟踪一下C语言代码,发现其实这一等待过程是由 do_wait_for_common()函数实现的,它的C语言代码如下,请看:

还是比较清晰的,这里就不再赘述了。至此,我们就了解了Linux内核是如何创建线程并投入运行,以及如何结束内核线程的了。

小结

本节主要讨论了 Linux 内核中的线程的创建,应该能够看出,其实核心还是围绕对 task_struct 结构的管理,这与管理进程并无过多区别。因此,说Linux中的线程只是一种特殊的进程,一点也不为过。

首先关于内核心进程创建,涉及到底层的东西,个人认为没必要太深入,了解他是怎么实现的就可了,如果确实要深入理解,那就得去看源码了。

1.Linux 进程创建:Linux继承了UNIX的进程创建方式,用的是fork API函数,什么是fork呢,就是先clone然后在分支,父子进程各干各的。

2.Windows进程创建:Windows没有fork,但是有CreateProcess这个API函数,用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

-  转载自fychit创意空间 早前想写写linux线程32313133353236313431303231363533e4b893e5b19e31333363386231编程windows线程编程每写知道哪写起自知道东西都写面我谈谈linux线程及线程同步并windows线程进行比较看看间相同点同  其实始我搞windows编程包括windows编程windows 驱包括usb驱ndis驱,pci驱1394驱等等同条龙服务做windows应用程序发面慢慢我linux发产比较深兴趣转搞linux发接我写些博客主要写linux编程windows编程区别吧现想写linuxusb驱windowsusb驱发区别些都等我linux线程windows线程讲解完我再写篇usb驱谈谈windows linux usb驱东东言归传始线程  首先我讲讲要采用线程编程其实并所程序都必须采用线程些候采用线程性能没单线程所我要搞清楚候采用线程采用线程处:  (1)线程彼间采用相同址空间共享部数据进程相比代价比较节俭进程启新进程必须配给独立址空间需要数据表维护代码段数据段堆栈段等等  (2)线程进程相比明显优点线程间通信同进程说具独立数据空间要进行数据传递能通通信式进行种式仅费且便于线程间直接共享数据比简单式共享全局变量共享全部变量要注意哦呵呵必须注意同步知道呵呵  (3)cpu情况同线程运行同cpu完全并行  反我觉种情况采用线程比较理想比说要做任务2步骤提高工作效率线程技术辟2线程第线程做第步工作第2线程做第2步工作候要注意同步第步做完才能做第2步工作我采用同步技术进行线程间通信  针种情况我首先讲讲线程间通信windows平台线程间通信采用主要:  (1)共享全局变量,种容易想呵呵首先讲讲吧比说吧面问题第步要向第2步传递收据我间共享全局变量让两线程间传递数据主要考虑同步面线程数据进行操作候第线程改变数据内容同步保护严重知道种情况读脏数据种情况我容易想同步设置bool flag比说第2线程没用完数据前第线程能写入2线程所需间相同候达效率同步比较麻烦咱几缓冲区进行操作像产者消费者2线程直跑由于间致缓冲区迟早溢种情况要考虑让数据写入让数据覆盖掉数据候要具体问题具体析打住呵呵用bool变量控制同步linux windows  既讲道再讲讲其同步同 针面问题共享全局变量同步问题除采用bool变量外容易想互斥量呵呵传说加锁windows加锁linux加锁类似采用互斥量进行同步要想进入段代码先必须获互斥量  linux互斥量函数:  windows互斥量函数:createmutex 创建互斥量获互斥量waitforsingleobject函数用完释放互斥量ReleaseMutex(hMutex)减0候 内核才释放其象面windows与互斥几函数原型  HANDLE WINAPI CreateMutex(  __in LPSECURITY_ATTRIBUTES lpMutexAttributes,  __in BOOL bInitialOwner,  __in LPCTSTR lpName  );  用创建名或名互斥量象  第参数 指向结构体SECURITY_ATTRIBUTES 般设null;  第二参数 指函数应应状态 FALSE前拥者创建互斥  第三参数 指明否名互斥象 名 用null  DWORD WINAPI WaitForSingleObject(  __in HANDLE hHandle,  __in DWORD dwMilliseconds  );  第 创建互斥象句柄第二 表示少间返 设宏INFINITE 则返 直用户自定义返  于linux操作系统互斥类似函数同罢linux互斥相关几函数要闪亮登场  pthread_mutex_init函数:初始化互斥锁;  pthread_mutex_destroy函数:注销互斥锁;  pthread_mutex_lock函数:加锁功阻塞等待;  pthread_mutex_unlock函数:解锁;  pthread_mutex_trylock函数:测试加锁功立即返错误码EBUSY;  至于些函数用google搜呵呵讲windows用保护数据线程同步式  临界区临界区互斥类似间区别临界区速度快能用同步同进程内线程临界区获取释放函数:  EnterCriticalSection() 进入临界区; LeaveCriticalSection()离临界区 于线程共享内存东东讲  (2)采用消息机制进行线程通信同步windows面消息机制函数用postmessageLinux消息机制我用较少说谁熟悉告诉我呵呵  (3)windows另外种线程通信事件信号量同针我始举例2线程同步间传递信息采用事件(Event)或信号量(Semaphore),比第线程完产数据必须告诉第2线程已经数据准备取走第2线程数据取走呵呵采用消息机制第线程准备数据直接postmessage给第2线程按理说采用postmessage线程搞定问题呵呵重点省略讲  于linux类似条件变量呵呵windowslinux同要特别讲讲才行  于windows采用事件信号量同步候都使用waitforsingleobject进行等待函数第参数句柄Event句柄或Semaphore句柄第2参数等待延迟终等久单位ms参数INFINITE限等待释放信号量函数ReleaseSemaphore();释放事件函数SetEvent使用些东西都要初始化讲Msdn搜神马都呵呵神马都浮云  于linux操作系统采用条件变量实现类似功能Linux条件变量般都互斥锁起使用主要函数:  pthread_mutex_lock ,  pthread_mutex_unlock,  pthread_cond_init  pthread_cond_signal  pthread_cond_wait  pthread_cond_timewait内容来自www.shufadashi.com请勿采集。

声明:本网内容旨在传播知识仅供参考,不代表本网赞同其观点,文字及图片版权归原网站所有。

你可能还关注
热门推荐
今日推荐 更多