Linux下C++编程及静态连接和动态连接,c语言编译过程及内存映射机制(一)(重点)
==今天发现一个非常厉害的大神博客专门深入研究linux和vs编辑器的使用的,贴上连接----luoweifu-------https://blog.csdn.net/luoweifu/article/details/50153461
----zhuanlan很多–https://blog.csdn.net/luoweifu (值得我们持续跟进学习)
Linux下C++的编程(一)
相比与使用windows平台开发,在自己独立带领一个项目开发时,还是一个跨平台项目就需要对linux下编程进行一个系统的学习。
什么是GUN
1984年,史拖曼开始GUN项目,这个项目的目的是创建一个*开放的UNIX操作系统,因为写操作系统太复杂,就先写在Unix上运行的小程序,也就是软甲你,但是不论什么软件都要编译成二进制档案(binary file)之后才能执行,因此它开始撰写c语言的编译器,就是现在很有名的gcc
这样GUN*软甲协议就出来了,GPL协议指的是通用公共许可证,由于GNU项目开发的软件都是开放源代码的*软件可能被其他人盗取所以就有了这个协议,
GUN开发的*软件
GCC,G++,Bash,Shell
首先GCC是the GUN Complier Collection的意思,即使GUN的一个编译器集合,里面包含多种编译器及相关工具如gcc,g++
GDB是GUN Project的一个调式程序,允许你查看一个程序执行时内部的具体执行逻辑,或者当程序崩溃时这个程序执行了什么
四件事情:
1.开始一个程序,指定任何可能影响它行为的事情
2.让你的程序以指定的条件暂停
3.当程序停止时检查发送什么
4。改变你程序中的变量和数据,以便你试验导致你程序bug的影响因素
Makefile
是程序编译的规则,记录着整个工程的编译规则(如源文件的编译顺序,依赖关系等),通过make工具进行编译。make工具makefile定义的规则将源代码译成二进制文件,用途特别是在类Unix系统中。
----------------分割线---------------------------------------------------
--------在linux编程中需要我们了解线程和进程–转载—luoweifu----http://blog.csdn.net/luoweifu/article/details/46595285
任务调度
理解线程,需要了解一些操作系统的相关概念。大部分操作系统的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫做运行状态,被暂停的任务处于就绪状态等待下一个属于它的时间片的到来。这样CPU执行效率非常高,时间片非常短,在各个任务之间快速的切换给人感觉多个任务在同时进行,也就是我们所说的并发。
**进程是一个具有一定独立功能的程序在一个数据集上的一次动态的执行过程,是操作系统进行资源配置和调度的一个独立单元,是应用程序运行的载体。是一个抽象概念,一般由程序,数据集合和进程控制快组成。程序用于描述进程要完成的功能,是控制进程执行的指令集,程序控制区(PCB)包含进程的描述信息和控制信息,是进程存在的唯一标识)
进程具有的特点
1.动态性:进程是程序的一次执行过程,是临时的,有生命的
2.并发性:任何进程可以同其他进城一起并发执行
3.独立性:进程是系统进行资源分配和调度的一个独立单位
结构性:
线程
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的程序由线程ID,当前指令指针(PC),寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。
线程和进程的区别
1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3.进程之间相互独立。但是同一进程下的各个线程之间共享程序的内存空间
4.调度与切换:线程上下文切换比进程上下文切换要快得多
多线程和多核
多核处理器下线程怎么执行:多核心处理器是指一个处理器上集成多个运算核心从而提高计算能力,也就是有多个正真并行计算的处理核心,每个处理核心对应一个内核线程。内核线程(KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器,一般一个处理核心对应一个内核线程。
什么是四核八线程
采用超线程技术将一个物理处理核心模拟成两个逻辑处理核心,对应两个内核线程,所以在操作系统中看到的cpu数量是实际物理CPU数量的两倍。
**程序一般不会直接去使用内核线程,而是去使用内核线程的一个高级接口i------轻量级进程(LWP),就是用户线程,用户线程与内核线程的对应关系有一对一,多对一,多对多
一堆一
对于一对一模型来说一个用户线程就唯一对应于一个内核线程(一个内核线程不一定有对应的用户线程),如果CPU没有采用超线程技术,一个用户线程就唯一的映射到一个物理CPU的线程,线程之间的并发是正真的并发。优点就是一个线程因某种原因阻塞时对其他线程的执行不受影响。
-------------------------------分割线-------------------------------------------------
---------------说完线程与进程,那么我们要来说说linux中的fork()函数--------转载自:jason314-----https://blog.csdn.net/jason314/article/details/5640969
一。fork入门知识
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但是如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的进程中。
/*
*huangenda
*/
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t fpid;//fpid表示fork函数的返回的值
int count = 0;
fpid = fork();
if(fpid ,< 0)
printf("error");
else if(fpid == o){
//创建子线程
}
else{
父线程}
**在语句fpid
= fork()之前,只有一个进程在执行这段代码,但是这条语句之后就有两个进程为什么这两个进程的fpid不同,这与fork()函数的特性有关。fork函数的一个奇妙之处在于调用一次却能返回两次且有三种不同的返回值:
1)在父进程中返回新建子进程deID
2)在子进程中返回0
3)出现错误返货负值
**两个进程的内容完全一样怎么打印结果不一样,因为还有变量,两个进程的变量都是独立的,存在不同的地址不是公用的。
想看该函数源码的同学可以参考博客连接----BruceZhang—https://blog.csdn.net/dlutbrucezhang/article/details/8692227
上一篇: linux下编译c语言教程