linux线程控制编程自学心得体会.docx

上传人:b****8 文档编号:8848992 上传时间:2023-02-02 格式:DOCX 页数:10 大小:26.78KB
下载 相关 举报
linux线程控制编程自学心得体会.docx_第1页
第1页 / 共10页
linux线程控制编程自学心得体会.docx_第2页
第2页 / 共10页
linux线程控制编程自学心得体会.docx_第3页
第3页 / 共10页
linux线程控制编程自学心得体会.docx_第4页
第4页 / 共10页
linux线程控制编程自学心得体会.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

linux线程控制编程自学心得体会.docx

《linux线程控制编程自学心得体会.docx》由会员分享,可在线阅读,更多相关《linux线程控制编程自学心得体会.docx(10页珍藏版)》请在冰豆网上搜索。

linux线程控制编程自学心得体会.docx

linux线程控制编程自学心得体会

linux线程控制编程自学心得体会

  篇一:

Linux学习心得

  Linux学习心得总结

  第二事业部

  Linux简介:

Linux是一套免费使用和自由传播的类Unix开源操作系统,是自由软件和开源代码的经典范例,由世界各地的成千上万的程序员设计和实现的。

具有开放性、多用户、多任务、出色的速度性能、良好的用户界面、丰富的网络功能、可靠的系统安全、良好的可移植性、标准兼容性等特点,在服务器,嵌入式,工控等方面都有广泛的应用。

目前风靡全球的Android智能系统也是基于Linux内核开发的。

  第一次接触Linux是在上大二的时候,一位给我们上课的老师在课间闲聊时用教训的语气给我们说,计算机专业的学生应该去好好学Linux,你要不会Linux都不好意思说自己是计算机科班毕业的(当然这有点夸张了,这位老师一直是研究Linux的,对Linux比较狂热),总之他说了一大堆Linux的好处,比如开源啊,稳定性强,支持平台多等等。

其实之前早就对Linux有所耳闻,但觉得这是专业人士才搞的东西,很高深,我离那一步还早着呢,所以当时也没听懂多少,听完过后只觉得Linux是个开源免费的操作系统,在Linux上面开发是比较有档次的,有前途的。

于是,一兴奋,回去就找了个师兄借了张RedHat(Linux一个比较稳定的商业发行版本)的光盘,在自己电脑上装了个Linux系统,在上面装上了QQ,音视频播放器,练了练Linux的命令,编译运行了"helloworld"之类的入门程序,玩了几天后,我发现了一个比较严重的问题,在Linux上没法玩魔兽和CS,兴奋劲一过,我的第一个Linux系统就在我的电脑分区下长眠了。

  到后来,学校开了些以Linux为实验平台的课程,于是又把Linux系统拿出来,在上面做老师布置的作业,对Linux也更了解了,自己也能勉强在那上面做些简单的应用开发,学会了更多的命令,了解了何为gcc,makefile,vi,gdb,知道了怎样调试自己的程序,仅此而已。

大三暑假找了个实习的工作,工作环境也是Linux方面的应用程序开发,实习了两个多月,跟着公司的老员工打杂,逐渐对Linux的应用开发也有了比较深入的了解,真正的产生了兴趣,自己也在Linux下做了些小东西,用socket+GTK完成了一个类似于QQ

  的局域网聊天工具等,当时高兴了好几天。

  毕业后的第一份工作也是Linux相关的开发工作,到后来来XX也做Linux,毕业快四年了,真正在Linux上做开发也有四年多,从应用开发到驱动开发,再到研究内核。

做了这么多年来,不敢说有所成,但多少也有所得,有所感悟,回头看看自己学习的过程,也有过迷茫,彷徨甚至痛苦的经历,走过很多弯路,到现在也能勉强摸清Linux脉路了,还算欣慰。

我们部门还有很多Linux高手,我也不敢班门弄斧,在此只是把自己的学习经历和心得总结出来和大家分享,希望对感兴趣的同事有所帮助。

  首先就是基础知识,俗话说工欲善其事,必先利其器,Linux下95%以上的代码都是由C语言编写的(还有部分汇编和脚本),所以要想学好Linux,必须要有扎实的C语言基础,C语言看似简单,但要学好并不容易,它绝非我们大学教材里面讲的那点东西。

而且千万不要认为C语言过时了,它是开源社区,系统开发和嵌入式开发方面的王者,在软件世界可以预见的未来,C语言将永远不会被淘汰,并将持续不断的焕发生命力。

要学好C语言,没有别的办法,除了多写,多练,多看书,多看优秀代码(例如Linux内核代码)。

在此,给大家介绍几本我读过,并且读后觉得效果不错的经典书籍,入门的就不介绍了,大学基本上都学过,这里介绍几本进阶的,《C专家编程》,《C和指针》还有《C语言深度剖析》,前两本是国外优秀经典教材,国际级Hacker的巨作,是C语言进阶必备书籍,后一本是国内一个高人写的网络书籍,很多地方也参考了前两本,由于是中国人自己写的,并且语言诙谐幽默,读起来比较容易理解,把这几本书吃透,再加上大量的练

  习,你基本上就可以大胆的说你精通C语言了。

第二个需要掌握的基础知识就是数据结构和算法,Linux的代码里面运用了大量的链表,队列,堆栈,Hash表,排序查找等数据结构和算法,所以把这些基础搞好,在后续的开发学习中会有事半功倍的效果。

这里也没啥好多介绍的,计算机专业的话《数据结构与算法》课程是最重要的基础课,掌握这些是最基本的要求,没学过的话最好也找本书好好研究下。

当然,上面提到的基础知识也不是说要非常精通才能学Linux,C语言和数据结构不是一朝一夕就能学好的,一些东西先了解下,等在后期的学习开发过程中再慢慢补充也行。

  学Linux要怎么入手?

有哪些方法和路径?

我学的时候也在网上参考了很多Linux前辈的学习路径,基本上都大同小异,殊途同归,总结出来由简到难就是使用Linux—〉Linux系统编程开发—〉驱动开发和分析Linux内核,我也是这样一路走过来的。

要使用Linux,首先你要有思维上的转变,忘掉Windows,Linux和Windows的设计思想不同,操作方式也有很大的不同,Windowws以图形操作为主,而Linux的精髓在于命令行,基本上所有的Linux高级用户都是以命令操作为主,所以忘掉图形操作吧,把自己变成"命令控",多学一些命令,你会发现一切会变得简单。

然后学习下gcc,Makefile和gdb,这些是Linux编程的编译器和调试器,先知道怎么用就行了,在以后的编程中会大量使用到,到时候自然就熟悉了。

还有就是要学会搭建自己的开发环境,学着配置下samba,tftp之类的网络服务器,在以后都可能用的上的。

  现在我们就进入Linux的系统编程,Linux的系统编程主要分为文件操作,进程控制,线程控制,信号处理,IPC(进程间通信)这几个部分,这些都是Linux编程的基础,必须要掌握。

就文件操作来说,在Linux的内核层,很多系统接口和设备驱动的节点基本上都是以文件的形式映射到上层文件系统,用户要访问这些设备都必须通过文件操作来进行。

而且世界上不存在只有内核的操作系统,如果没有系统级的编程,内核就只是束之高阁的玩具,所以就算你的最终目的是驱动,是内核,这些东西也是必学的,在学这些的过程中也能锻炼你的Linux思维,加深功底,有了深厚的功底,后面的东西看起来会变得很简单。

在这个阶段我再推荐两本书,人民邮电出版社的《LinuxC编程实战》,这本书是Linux下系统编程的入门级书籍,虽说是入门,但涵盖了Linux下系统编程的所有主题,详略得当,也比较容易读懂,很适合初学者。

还有一本就是国外的经典教材《UINX环境高级编程》(AdvancedProgrammingintheUNIXEnvironment),这本书很厚(780页),我自己也没看完,讲的比前面那本更深入,更全面,也会更难一些,网上有人评论说在Linux系统编程上遇到的所有问题基本上都能在这本书上找到答案。

如果时间精力允许的话,强烈建议读完此书,并作为案头教材,随时参考,当然如果你暂时没有那么多精力的话,把第一本书看完并吃透,你也可以进入下一阶段---内核!

  进入内核,你的思维又得转变下了。

我在这里先声明一个概念,关于Linux操作系统的两种运行级别,在intelcpu上有Ring0-Ring3四个运行级别(其实不止是intel的cpu,几乎所有的cpu都有不同的运行级别,只是定义不同罢了),不同的级别运行权限不一样,一个低级别运行态不能随便访问高级别运行态的数据。

但在Linux上只用了两种,Ring3级运行用户态,Ring0运行内核态,没有使用Ring1和Ring2。

Ring3状态不能访问Ring0的地址空间,包括代码和数据。

Linux进程被映射到4GB的地址空间,0-3GB是用户态和内核态共享的,3GB-4GB是内核态专用的地址空间,这里存放了整个内核的代码和内核模块,以及内核所维护的数据。

用户的应用程序是运行在用户态的,如果需要访问内核态的数据,比如应用层需要与驱动交互,进行网络数据发送等,则必须使用open,read/write,ioctl,send等系统调用才能访问到,系统调用会调用到内核中的代码,这时,必须切换到Ring0,然后进入3GB-4GB的内核地址空间去执行这些内核代码,完成后,切换回Ring3,回到用户态。

这样,用户态的程序就不能随意操作内核地址空间,对内核起到一定的安全保护作用。

所以当进入内核编程时,一切也要小心,稍微不注意就会把系统搞挂。

另外还有一个事情提醒下大家,内核态和用户态相当于两个世界了,两个世界两个制度,之前在应用层编程的用的得心应手的C函数库在内核态就不能再用了,之前的很多编程调试技巧在内核里面也不起作用了。

所以,我们又得从"HelloWorld"开始了。

  写一个内核模块程序应该算是内核的"HelloWorld"了,把这个程序编译并装载进内核运行后,了解其运行机制,你基本上就算进入内核了(当然你也得先了解内核的基本架构,知道怎么编译配置一个内核),但后面的路还很长,相当于万里长征的第一步。

接下来你就可以研究Linux驱动了,关于驱动的学习,除了Linux自身的驱动原理架构要掌握之外,硬件基础和实践都是很重要的,所以对硬件基础较差的初学者来说这个阶段最好有人带,一个人自学的话往往收效甚微,你自己琢磨一个星期都想不明白的事情,别人可能一句话就能把你点通。

这个阶段不得不推荐的书当然就是Linux驱动开发人员的圣经---O'REILLY的《Linux设备驱动程序》(俗称LDD)了,现已出了第三版,基于内核,这本书理论讲解透彻,包括了Linux驱动开发中常用到的所有技术点,把底层内核提供给驱动的API介绍的也比较清楚,而且每个技术点都有相应的例子供你练习,学的时候注意多实践,不要一味的看书,而且不要指望第一遍就能看懂他,我断断续续看了三遍以上,很多地方也还拿不准,这本书对做驱动的人来说,读五遍以上一点都不过分,每读一遍你都会有新的收获,回味无穷。

但这本书对基础较差的人来说起点偏高,不容易看懂,国内也有不少关于Linux驱动的书,但真正能拿的出手的不多,宋宝华的《Linux设备驱动开发详解》还算不错,他很多地方参考了前面那本,虽说比起来还有一定的差距,但对初学者来说更容易看懂,建议两本书交叉着一起看,遇到不懂的可以相互参考,看完这两本书,你基本上就掌握了驱动开发的基础了,剩下的就是实际开发经验。

驱动方面我就不多说了,很多同事都有丰富的经验,每个人的基础不一样,所处的环境不一样(是否有

  人带,是否有机会参加实际项目开发),学习的效果也是有很大的差距的。

如果真的没人带的话,最好自己买个arm开发板,在网上找资料,自己玩板子,没有实际调试,就枉谈驱动开发。

另外在学习的驱动的时候最好能深入研究驱动的实现原理和机制,多思考,比如知道怎么去创建一个字符设备了,但对实现原理不大清楚的话就深入点去看看Linux设备模型,了解Linux系统的设备管理机制,对整个系统的掌控都会有不小的收获,不要认为把结果调出来完成了工作你就掌握了Linux驱动开发,那样长期以往,你有的只是靠时间累积起来的经验,但如果能深挖内部原理,你的能力将呈指数增长。

  知道了怎么用kmalloc()不代表你就懂的Linux的内存管理系统,知道schedule()函数也不代表你知道操作系统的进程调度原理,正如同会说汉语并不能说明你了解中国文化一样,如果你有足够的好奇心,吃的下苦,有足够的时间精力,那就去读Linux内核源码吧,去了解操作系统的核心,内核比较难啃,但能啃下来的话你将收获颇丰。

  Linux的内核主要分为五个模块,内存管理,文件系统,进程调度,进程间通信(IPC)和网络接口。

进程调度控制进程对CPU的访问;内存管理控制进程对内存区域的安全访问,Linux的内存管理还使用了虚拟内存,较为复杂;虚拟文件系统隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,目前Linux提供了数十种的文件系统的支持;进程间通信(IPC)提供了各个进程之间相互通信的机制;网络接口提供了对各种网络标准的存取和各种网络硬件的支持。

从图可以看到进程调度是最核心的模块,也是整个操作系

  篇二:

跟我学Linux编程-8-多线程简单示例

  多线程编程简单示例

  今天,我们将写一个简单的多线程示例程序,来做为我们多线程学习的初步开始。

先上例子再做解释:

  #include

  #include

  //线程执行函数

  void*thread_task(void*arg)

  {

  intid=(int)arg;

  intcnt=0;

  while

(1)

  {

  printf("[%d]:

%d\n",id,cnt);

  cnt++;

  sleep

(1);

  }

  returnNULL;

  }

  intmain(intargc,char*argv[])

  {

  pthread_tthr;

  //创建两个线程

  pthread_create(&thr,NULL,thread_task,(void*)1);

  pthread_create(&thr,NULL,thread_task,(void*)2);

  thread_task((void*)0);

  return0;

  }

  写多线程程序,有如下几个要点:

  1#include,多线程编程相关的库函数需引用这个头文件。

  2为每个线程写一个线程执行函数(线程任务逻辑相同,可以使用同一个线程执行函数),如示例中的pthread_task,就是线程执行函数。

线程执行函数的形式为:

void*task(void*arg);其返回值为void*,参数也为void*。

如果多个线程使用同一个线程执行函数,那么arg参数是一个能够用于实际区分这些线程任务的重要内容。

  3调用phread_create接口,创建每一个线程,并为其指定线程执行函数以及参数。

其接口定义为:

  intpthread_create(pthread_t*tidp,constpthread_attr_t*attr,(void*)(*start_rtn)(void*),void*arg);

  其中:

  tidp是线程对像,由调用者指定,用于返回线程编号;

  attr是线程参数,如线程优先级等,我们通常设置为NULL;

  start_rtn为线程执行函数,线程创建后,调用start_rtn,start_rtn运行结束,线程也就终止;arg为线程执行函数的参数,pthread_create本身并不使用,只是简单将其传给start_rtn。

  4编译程序时,需链接pthread动态库。

我们的示例程序源码为,编译生成的目标文件为thread,则gcc编译命令为:

  gcc–othread-lpthread

  其中,-l表连接动态库,其后边跟动态库名称。

  示例程序顺利通过编译后,运行,我们将会看到程序不断在屏幕上交替打印记数器。

其输出结果类似(注意只是类似)为:

  [1]:

0

  [2]:

0

  [0]:

0

  [1]:

1

  [2]:

1

  [0]:

1

  [1]:

2

  [2]:

2

  [0]:

2

  [1]:

3

  [0]:

3

  [2]:

3

  …

  我们来对代码进行分析,本例子中,函数thread_task为线程执行函数。

它的功能非常简单:

维护一个记数器,每秒将其加一,并在屏幕上将其值打印出来。

为了区分是那个线程打印的,我们为每个线程指定了一个编号,其编号通过线程执行函数的参数给定,因于线程执行函数的参数只能是void*类型,因此,在创建线程的时候,我们先将整数转化成void*类型,见主函数代码:

  pthread_create(&thr,NULL,thread_task,(void*)1);

  将1强制转化成void*,然后再在线程执行函数中,又将void*强制转化成int,实现了数据的还原,见thread_task函数代码第一行:

  intid=(int)arg;

  主函数中,我们调用pthread_create创建了两个线程:

  pthread_create(&thr,NULL,thread_task,(void*)1);

  pthread_create(&thr,NULL,thread_task,(void*)2);

  两个线程的执行函数都是thread_task,但给的参数不相同(一个是(void*)1,一个是(void*)2),因此thread_task中能够输出不同的id,这是多个线程共用一个线程函数却做不同事情(程序逻辑一致,但处理对像不同)的实现方法。

  实事上,程序输出的信息中,有三组不同编号的打印,这是因为主函数也调用了thead_task函数,并指定编号为0:

  thread_task((void*)0);

  示例这么写,并不是说主函数要调用线程执行函数,这两者之前没有必然联系。

示例的真正目的有如下几个:

  1线程执行函数并不是什么特殊的函数,可以做为pthread_create的start_rtn参数被线程调用,也可以被普通函数所调用。

  2告诉大家,多线程程序中,除由pthread_create创建线程外,还隐式地创建了一个主线程,我们的main函数就是在主线程中执行的,因此示例程序虽然只用ptread_create创建了两个线程,但实际上却有三个线程在交替打印信息。

  3如果主线程退出(也就是main函数退出),程序中其他线程也会被终止,所以主函数也套用了thread_task函数的死循环来避免程序退出。

在实际的编程中,main函数除做无意义的死循环外(但又不得不做),也可以用其来做一些重复的事情,提高些许效率。

  通过上面的简单示例以及讲解,相信大家对多线程编程有了一个初步的认识。

本章节所涉及的知识,对于一些特别简单的多线程应用基本够用,更高阶段的知识,如变量共享、每线程变量、线程竞争与同步等,将在后边的章节中陆续展开。

  篇三:

学习Linux的心得

  Linux学习心得

  Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。

因为我是学习嵌入式方向的,这学期就选修了这门专业任选课。

为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了系统。

眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。

  一、Linux简介

  Linux是一种广泛使用的类UNIX操作系统,它不仅可以在Intel,AMD等系列个人计算机上运行,也可以运行在许多工作站上。

它是真正多用户、多任务操作系统,他继承了UNIX系统的主要特征,具有强大的信息处理功能,特别在Internet和Intranet应用中占有明显优势。

1991年,芬兰赫尔辛基大学的学生LinuxTorvalds在Inter386个人计算机上开发了Linux核心,并利用互联网发布了源代码,从而创建了Linux操作系统。

之后,许多系统软件设计专家共同对它进行改进和提高。

  到现在为止,Linux已成为具有全部UNIX特征、与POSIX兼容的操作系统。

Linux的功能强大而全面,与其他操作系统相比,具有一系列显著特点:

1.与UNIX系统兼容。

2.自由软件和源码公开。

3.性能高和安全性强。

4.便于定制和再开发。

5.互操作性高。

6.全面的多任务和真正的32位操作系统,当今的Linux有两种版本:

核心版本和发行版本。

其中核心版本主要是Linux的内核。

随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。

目前,其主要应用领域是服务器系统和嵌入式系统。

然而,它的足迹已遍布各个行业,几乎无处不在。

  二、Linux与Window的区别的联系

  Windows是图形界面的,Linux类似以前的DOS,是文本界面的,如果你运行了图形界面程序X-WINDOWS后,Linux也能显示图形界面,也有开始菜单、桌面、图标等。

Windows有MS-DOS方式,在该方式下通过输入DOS命令来操作电脑;Linux与Windows类似,也有命令方式,Linux启动后如果不执行X-WINDOWS,就会处于命令方式下,必须发命令才能操作电脑。

它不同于Windows系统需要花钱购买,因为Linux的核心是免费的,自由使用的,核心源代码是开放的。

任何人都可以根据自己的喜好来定制适合自己的操作系统,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。

  三、我学习Linux的收获

  通过这学期的学习,我慢慢的学习到了更深入的知识内存寻址,进程,内存管理,中断与异常,系统调用,内核中的同步,以及文件系统等,下来浅谈几个自己掌握的比较好的方面:

  1、内存寻址:

  内存寻址是指CPU允许支持的内存大小。

双通道内存技术其实是一种内存控制和管理技术,它依赖于芯片组的内存控制器发生作用,在理论上能够使两条同等规格内存所提供的带宽增长一倍。

当计算机面临大量的数据流时,32位的寄存器和指令集不能及时进行相应的处理运算。

32位处理器一次只能处理32位,也就是4个字节的数据;而64位处理器一次就能处理64位,即8个字节的数据。

举例来说,32位好像是单车道,当车流过大的时候,

  就会无法承载,而64位好比高速公路,在多任务,多程序处理的情况下,64位计算平台能随意加速、把电脑性能发挥到极致。

  2、Linux进程调度:

  内核线程只运行在内核态,不受用户态上下文的拖累,唯一使用的资源是内核栈和上下文切换时保持寄存器的空间,调度时的开销可能和进程自身差不多昂贵,资源的同步和数据共享比整个进程的数据同步和共享要低一些

  a.调度过程:

由在用户空间实现的线程库,在所属进程内进行调度Linux使用的线程库LinuxThreads是用户空间的线程库,所采用的是线程-进程1对1模型(即一个用户线程对应一个轻量级进程,而一个轻量级进程对应一个特定的内核线程),将线程的调度等同于进程的调度,调度交由内核完成,而线程的创建、同步、销毁由核外线程库完成(LinuxThtreads已绑定到GLIBC中发行)。

在LinuxThreads中,由专门的一个管理线程处理所有的线程管理工作。

当进程第一次调用pthread_create()创建线程时就会先创建(clone())并启动管理线程。

后续进程pthread_create()创建线程时,都是管理线程作为pthread_create()的调用者的子线程,通过调用clone()来创建用户线程,并记录轻量级进程号和线程id的映射关系,因此,用户线程其实是管理线程的子线程。

LinuxThreads只支持调度范围为PTHREAD_SCOPE_SYSTEM的调度,默认的调度策略是SCHED_OTHER。

用户线程调度策略

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1