Android系统架构开篇


640?wx_fmt=jpeg

Android系统庞大且错综复杂,Gityuan带领大家初探Android系统整体架构,一窥其全貌。


一、引言

本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰。Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。

为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张Google官方提供的经典分层架构图,从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模块或子系统。

640?wx_fmt=jpeg上图采用静态分层方式的架构划分,众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,相互之间进行着各种错终复杂的信息传递与交互流,从这个角度来说此图并没能体现Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。为了更深入地掌握Android整个架构思想以及各个模块在Android系统所处的地位与价值,计划以Android系统启动过程为主线,以进程的视角来诠释Android M系统全貌,全方位的深度剖析各个模块功能,争取各个击破。这样才能犹如庖丁解牛,解决、分析问题则能游刃有余。

二、Android架构

Google提供的5层架构图很经典,但为了更进一步透视Android系统架构,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌,阐述Android内部的环环相扣的内在联系。

系统启动架构图

640?wx_fmt=jpeg

图解:Android系统启动过程由上图从下往上的一个过程是由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App,接来下简要说说每个过程:

关于Loader层:

  • Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在 ROM里的预设代码开始执行,然后加载引导程序到 RAM

  • Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能。

2.1 Linux内核层

Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。

  • 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;

  • 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。 kthreadd进程是所有内核进程的鼻祖

2.2 硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。

2.3 Android Runtime & 系统库

每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少。ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。

这里的Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程, init进程是所有用户进程的鼻祖

  • init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;

  • init进程还启动 servicemanager(binder服务管家)、 bootanim(开机动画)等重要服务

  • init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程), Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。

2.4 Framework层

  • Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:

  • 加载ZygoteInit类,注册Zygote Socket服务端套接字

  • 加载虚拟机

  • 提前加载类preloadClasses

  • 提前加载资源preloadResouces

  • System Server进程,是由Zygote进程fork而来, SystemServerZygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。

  • Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。

2.5 App层

  • Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;

  • Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。

  • 所有的App进程都是由Zygote进程fork生成的。

2.6 Syscall && JNI

  • Native与Kernel之间有一层系统调用(SysCall)层,见Linux系统调用(Syscall)原理;

  • Java层与Native(C/C++)层之间的纽带JNI,见Android JNI原理分析。

三、通信方式

无论是Android系统,还是各种Linux衍生系统,各个组件、模块往往运行在各种不同的进程和线程内,这里就必然涉及进程/线程之间的通信。对于IPC(Inter-Process Communication, 进程间通信),Linux现有管道、消息队列、共享内存、套接字、信号量、信号这些IPC机制,Android额外还有Binder IPC机制,Android OS中的Zygote进程的IPC采用的是Socket机制,在上层system server、media server以及上层App之间更多的是采用Binder IPC方式来完成跨进程间的通信。对于Android上层架构中,很多时候是在同一个进程的线程之间需要相互通信,例如同一个进程的主线程与工作线程之间的通信,往往采用的Handler消息机制。

想深入理解Android内核层架构,必须先深入理解Linux现有的IPC机制;对于Android上层架构,则最常用的通信方式是Binder、Socket、Handler,当然也有少量其他的IPC方式,比如杀进程Process.killProcess()采用的是signal方式。下面说说Binder、Socket、Handler:

3.1 Binder

Binder作为Android系统提供的一种IPC机制,无论从系统开发还是应用开发,都是Android系统中最重要的组成,也是最难理解的一块知识点,想了解为什么Android要采用Binder作为IPC机制? 可查看我在知乎上的回答。深入了解Binder机制,最好的方法便是阅读源码,借用Linux鼻祖Linus Torvalds曾说过的一句话:Read The Fucking Source Code。下面简要说说Binder IPC原理。

Binder IPC原理

Binder通信采用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。

640?wx_fmt=jpeg想进一步了解Binder,可查看Binder系列—开篇,Binder系列花费了13篇文章的篇幅,从源码角度出发来讲述Driver、Native、Framework、App四个层面的整个完整流程。根据有些读者反馈这个系列还是不好理解,这个binder涉及的层次跨度比较大,知识量比较广,建议大家先知道binder是用于进程间通信,有个大致概念就可以先去学习系统基本知识,等后面有一定功力再进一步深入研究Binder机制。

Binder原理篇

序号文章名概述
0Binder系列—开篇Binder概述
1Binder系列3—启动Service ManagerServiceManager守护进程 注册和查询服务
2Binder系列4—获取Service Manager获取代理对象BpServiceManager
3Binder系列5—注册服务(addService)注册Media服务
4Binder系列6—获取服务(getService)获取Media代理,以及DeathRecipient
5Binder系列7—framework层分析framework层服务注册和查询,Binder注册
6理解Binder线程池的管理Binder的startThreadPool过程
7彻底理解Android Binder通信架构startService为主线
8Binder系列10—总结Binder的简单总结
9Binder IPC的权限控制clearCallingIdentity/restoreCallingIdentity
10Binder死亡通知机制之linkToDeathBinder死亡通知机制

Binder驱动篇:

1Binder Driver初探驱动open/mmap/ioctl,以及binder结构体
2Binder Driver再探Binder通信协议,内存机制


Binder使用篇:

1如何使用BinderNative层、Framwrok层自定义Binder服务
2如何使用AIDLApp层自定义Binder服务


3.2 Socket

Socket通信方式也是C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:

  • zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;

  • installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;

  • lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;

  • adbd:这个也不用说,用于服务adb;

  • logcatd:这个不用说,用于服务logcat;

  • vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。

等等还有很多,这里不一一列举,Socket方式更多的用于Android framework层与native层之间的通信。Socket通信方式相对于binder比较简单,这里省略。

3.3 Handler

Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信,Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的,为了方便且称之为Handler消息机制。

有人可能会疑惑,为何Binder/Socket用于进程间通信,能否用于线程间通信呢?答案是肯定,对于两个具有独立地址空间的进程通信都可以,当然也能用于共享内存空间的两个线程间通信,这就好比杀鸡用牛刀。接着可能还有人会疑惑,那handler消息机制能否用于进程间通信?答案是不能,Handler只能用于共享内存地址空间的两个线程间通信,即同进程的两个线程间通信。很多时候,Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:

640?wx_fmt=jpeg由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量MessageQueue中添加新Message,主线程一直处于loop()方法内,当收到新的Message时按照一定规则分发给相应的handleMessage()方法来处理。所以说,Handler消息机制用于同进程的线程间通信,其核心是线程间共享内存空间,而不同进程拥有不同的地址空间,也就不能用handler来实现进程间通信。

上图只是Handler消息机制的一种处理流程,是不是只能工作线程向UI主线程发消息呢,其实不然,可以是UI线程向工作线程发送消息,也可以是多个工作线程之间通过handler发送消息。更多关于Handler消息机制文章:

  • Android消息机制-Handler(framework篇)

  • Android消息机制-Handler(native篇)

  • Android消息机制3-Handler(实战)

要理解framework层源码,掌握这3种基本的进程/线程间通信方式是非常有必要,当然Linux还有不少其他的IPC机制,比如共享内存、信号、信号量,在源码中也有体现,如果想全面彻底地掌握Android系统,还是需要对每一种IPC机制都有所了解。

四、核心提纲

博主对于Android从系统底层一路到上层都有自己的理解和沉淀,通过前面对系统启动的介绍,相信大家对Android系统有了一个整体观。接下来需抓核心、理思路,争取各个击破。后续将持续更新和完善整个大纲,不限于进程、内存、IO、系统服务架构以及分析实战等文章。

当然本站有一些文章没来得及进一步加工,有时间根据大家的反馈,不断修正和完善所有文章,争取给文章,再进一步精简非核心代码,增加可视化图表以及文字的结论性分析。基于Android 6.0的源码,专注于分享Android系统原理、架构分析的原创文章。

建议阅读群体: 适合于正从事或者有兴趣研究Android系统的工程师或者技术爱好者,也适合Android App高级工程师;对于尚未入门或者刚入门的App工程师阅读可能会有点困难,建议先阅读更基础的资料,再来阅读本站博客。

看到Android整个系统架构是如此庞大的, 该问如何学习Android系统, 以下是我自己的Android的学习和研究论,仅供参考如何自学Android。

从整理上来列举一下Android系统的核心知识点概览:

640?wx_fmt=jpeg4.1 系统启动系列

640?wx_fmt=jpeg

Android系统启动-概述:

Android系统中极其重要进程:init, zygote, system_server, servicemanager 进程:

序号进程启动概述
1init进程Linux系统中用户空间的第一个进程, Init.main
2zygote进程所有App进程的父进程, ZygoteInit.main
3system_server进程(上篇)系统各大服务的载体, forkSystemServer过程
4system_server进程(下篇)系统各大服务的载体, SystemServer.main
5servicemanager进程binder服务的大管家, 守护进程循环运行在binder_loop
6App进程通过Process.start启动App进程, ActivityThread.main


再来看看守护进程(也就是进程名一般以d为后缀,比如logd,此处d是指daemon的简称), 下面介绍部分守护进程:

  • debuggerd

  • installd

  • lmkd

  • logd

4.2 系统稳定性系列

Android系统稳定性主要是异常崩溃(crash)和执行超时(timeout),:

序号文章名概述
1理解Android ANR的触发原理触发ANR的场景以及机理
2Input系统—ANR原理分析input触发ANR的原理
3理解Android ANR的信息收集过程AMS.appNotResponding过程分析,收集traces
4解读Java进程的Trace文件kill -3 信息收集过程
5Native进程之Trace原理debuggerd -b 信息收集过程
6WatchDog工作原理WatchDog触发机制
7理解Java Crash处理流程AMS.handleApplicationCrash过程分析
8理解Native Crash处理流程debuggerd守护进程
9global reference限制策略global reference


4.3 Android进程系列

进程/线程是操作系统的魂,各种服务、组件、子系统都是依附于具体的进程实体。深入理解进程机制对于掌握Android系统整体架构和运转机制是非常有必要的,是系统工程师的基本功,下面列举进程相关的文章:

序号文章名概述
1理解Android进程创建流程Process.start过程分析
2理解杀进程的实现原理Process.killProcess过程分析
3Android四大组件与进程启动的关系AMS.startProcessLocked过程分析组件与进程
4Android进程绝杀技--forceStopforce-stop过程分析彻底移除组件与杀进程
5理解Android线程创建流程3种不同线程的创建过程
6彻底理解Android Binder通信架构以start-service为线,阐述进程间通信机理
7理解Binder线程池的管理Zygote fork的进程都默认开启binder线程池
8Android进程生命周期与ADJ进程adj, processState以及lmk
9Android LowMemoryKiller原理分析lmk原理分析
10进程优先级进程nice,thread priority以及scheduler
11Android进程调度之adj算法updateOomAdjLocked过程
12Android进程整理整理系统的所有进程/线程


4.4 四大组件系列

对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,接下分别展开介绍:

序号文章名类别
1startActivity启动过程分析Activity
2简述Activity生命周期Activity
3startService启动过程分析Service
4bindService启动过程分析Service
5以Binder视角来看Service启动Service
6Android Broadcast广播机制分析Broadcast
7理解ContentProvider原理ContentProvider
8ContentProvider引用计数ContentProvider
9Activity与Service生命周期Activity&&Service
10简述Activity与Window关系Activity&&Window
11四大组件之综述AMS
12四大组件之ServiceRecordService
13四大组件之BroadcastRecordBroadcast
14四大组件之ContentProviderRecordContentProvider
15理解Android ContextContext
16理解Application创建过程Application
17unbindService流程分析Service
18四大组件之ActivityRecordActivity
19AMS总结(一)AMS


4.5 图形系统系列

图形也是整个系统非常复杂且重要的一个系列,涉及WindowManager,SurfaceFlinger服务。

序号文章名类别
1WindowManager启动篇Window
2WMS之启动窗口篇Window
3以Window视角来看startActivityWindow
4Android图形系统概述SurfaceFlinger
5SurfaceFlinger启动篇SurfaceFlinger
6SurfaceFlinger绘图篇SurfaceFlinger
7Choreographer原理Choreographer


4.6 系统服务篇

再则就是在整个架构中有大量的服务,都是基于Binder来交互的,Android系统服务的注册过程也是在此之上的构建的。计划针对部分核心服务来重点分析:

  • AMS服务

  • AMS启动过程(一)

  • 更多组件篇[见小节4.3]

  • Input系统

  • Input系统—启动篇

  • Input系统—InputReader线程

  • Input系统—InputDispatcher线程

  • Input系统—UI线程

  • Input系统—进程交互

  • Input系统—ANR原理分析

  • PKMS服务

  • PackageManager启动篇

  • Installd守护进程

  • Alarm服务

  • 理解AlarmManager机制

  • JobScheduler服务

  • 理解JobScheduler机制

  • BatteryService

  • Android耗电统计算法

  • PMS服务

  • DropBox服务

  • DropBoxManager启动篇

  • UserManagerService

  • 多用户管理UserManager

  • 更多系统服务

  • 敬请期待

4.7 内存&&存储篇

  • 内存篇

    • Android LowMemoryKiller原理分析

    • Linux内存管理

    • Android内存分析命令

  • 存储篇

    • Android存储系统之源码篇

    • Android存储系统之架构篇

  • Linux驱动篇

    • 敬请期待

  • dalvik/art

    • 解读Java进程的Trace文件

4.8 工具篇

再来说说Android相关的一些常用命令和工具以及调试手段.

序号文章名类别
1理解Android编译命令build
2理解Android.bpbuild
2性能工具Systracesystrace
3Android内存分析命令Memory
4ps进程命令Process
5Am命令用法Am
6Pm命令用法Pm
7调试系列1:bugreport源码篇bugreport
8调试系列2:bugreport实战篇bugreport
9dumpsys命令用法dumpsys
10Android logd日志原理logd
11介绍gdb调试工具gdb
12介绍addr2line调试命令addr2line


4.9 实战篇

下面列举处理过的部分较为典型的案例,供大家参考

序号文章名类别
1Binder Driver缺陷导致定屏的案例binder
2深度解读ArrayMap优势与缺陷ArrayMap
3数组越界导致系统重启的案例数组越界
4一行Log引发多线程并发问题的案例多线程并发
5跑monkey压力测试过程的冻屏案例monkey冻屏
6深度剖析APP保活案例保活

本文只是提纲挈领的篇章,更多详细文章可点击下方阅读原文,进入我的博客Gityuan.com阅读,博主仍在持续更新。

五、结束语

Android系统之博大精深,包括Linux内核、Native、虚拟机、Framework,通过系统调用连通内核与用户空间,通过JNI打通用户空间的Java层和Native层,通过Binder、Socket、Handler等打通跨进程、跨线程的信息交换。只有真正阅读并理解系统核心架构的设计,解决问题和设计方案才能做到心中无剑胜有剑,才能做到知其然知其所以然。当修炼到此,恭喜你对系统有了更高一个层次的理解,正如太极剑法,忘记了所有招式,也就练成了太极剑法。

再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互工作,而是背后成千上万个小蝌蚪的动态执行流。记得《侠客行》里面的龙木二岛主终其一生也无法参透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙壁的图案想象成无数游动的蝌蚪,最终成就绝世神功。一言以蔽之,程序代码是死的,系统运转是活的,要以动态视角去理解系统架构。


推荐阅读:

Android技术架构演进与未来

深度解读ArrayMap优势与缺陷

解读Android进程优先级ADJ算法

Binder Driver缺陷导致定屏的实战分析



640?wx_fmt=jpeg

640?wx_fmt=png



觉得不错

请点在看




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20155220 实验三 敏捷开发与XP实践 实验报告

20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础XP核心实践相关工具实验要求 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意…

Android binder 框架和学习资料

1Android binder 是学习 Android 系统一定要啃得硬骨头,可能你刚开始的时候并不理解其中的精髓,但是在 android 系统的很多地方你都会遇到它。不过要我自己写明白其中的逻辑脉络需要花费太多的时间和精力,而且传播效果也不是非常好…

Spring_Bean配置_生命周期_注解

Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之…

完全理解Gson(1):简单入门

GSON是Google开发的Java API,用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问:http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础,因此不需要任何GSON…

创业碎碎念

1今天,跟几条跟我玩的比较好的篮球狗在讨论人生,其中有一条特别感慨,「为何看上去别人做起来这么容易的事,我们做很难?」。我突然不知道如何去回答这样的问题?这个问题也一直困扰着我。读我文章…

压缩过的js代码怎么还原_Fundebug 前端 JS插件更新至 1.7.0,拆分录屏代码,还原部分 Script error....

摘要: BUG 监控插件压缩至 18K。1.7.0拆分了录屏代码,BUG 监控插件压缩至18K,另外我们还原了部分 Script error,帮助用户更方便地 Debug。请大家及时更新哈~拆分录屏代码从1.7.0版本开始,我们拆分了录屏代码。如果需要…

SpringAOP描述及实现_AspectJ详解_基于注解的AOP实现_SpringJdbcTemplate详解

AOP AOP特点: 面向切面编程, 利用AOP对业务逻辑的各个部分进行抽取公共代码, 降低耦合度, 提高代码重用性, 同时提高开发效率.采取横向抽取, 取代传统纵向继承体系重复性代码解决事务管理, 性能监视, 安全检查, 缓存, 日志等问题Spring AOP在运行期, 通过反向代理的方式解决类…

(十九)java多线程之ForkJoinPool

本人邮箱: kco1989qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 引言 java 7提供了另外一个很有用的线程池框架,Fork/Join框架 理论 Fork/Join框架主要有以下两个类组…

串口,com口,ttl,max232你应该知道的事

1今天,说几个比较基础的知识,大家在开发过程中经常会遇到但是又不是特别注意的知识点。TTL电平:TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通…

Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]

这篇文章主要介绍Caffe2的基本数据结构: WorkspacesOperatorsNets在开始之前最好先阅读以下Intro Turorial首先,导入caffe2。其中core和worksapce模块,这是必须的两个模块。如果你要使用Caffe2生成的protocol buffers,那么你也需要…

Linux 开发者最应该知道的命令汇总

1最近发现一个好东西,在 github 上发现的,我觉得非常适合大家研究 linux,说白了就是一些命令而已,只不过是作者帮忙总结好了,比较适合大家开发和学习 linux 系统,so , 推荐给大家学习下。https:…

华为任职资格_华为采购总部专业任职资格标准|

目 录 序 言 概述 .........................第一部分 级别定义.....................第二部分 资格标准 ....................1、采购工程师(生产采购)任职资格标准........2、采购员(生产采购)任职资格标准............3、采购员…

C 语言内存分配

1昨天有一个群里的同学问我,他问我的问题是 c 语言函数是存在哪里的?是如何执行的?我下意识的觉得这位同学应该是个初学者,所以今天就写下一些基础方面的内容,「C语言的内存布局」。程序代码可以看做是一个…

没有梦想,你跟咸鱼有什么分别?

1标题起的有点夸张,其实这个就是一个招聘贴,之前从来没有用发头条文章来招聘,实在不好意思,这个招聘对我非常重要,这是一个非常好的朋友公司的招聘信息,也希望大家帮忙扩散一下,因为…

一个很Low的通讯录管理系统(但是能用)C/C++单链表实现

通讯录管理系统的设计 问题需求分析 在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯…

2017《面向对象程序设计》课程作业三

作业链接github链接 对于文件读写和多参数主函数学习过程中遇到的问题 这次文件读写改用了C的形式,然后总体还算顺利,借鉴了林燊的,因为他写的代码最容易看懂;还有就是借鉴了《C程序设计》,讲真,谭浩强的还…

华为不做黑寡妇,开源编译器,与友商共建安卓性能

1今天我的一个老哥开了头条号,第一次发文章,我觉得不错,拿来用用,给大家看看华为技术总工的文采。这位总工潜伏在我的微信群里很少说话,大家一定要有这个想法,就是最低调的那个人,真…

点击链接如何直接跳转到相对应的聊天窗口

解决这个问题的步骤如下&#xff1a; <a target"_blank" href"http://wpa.qq.com/msgrd?v3&uin3237465337&siteqq&menuyes">一、登陆腾讯官方网站&#xff1a;http://wp.qq.com/ 二、登陆之后&#xff0c;点“设置”&#xff0c;按下图…

哈夫曼树编码与译码(完整C/C++实现代码)

哈夫曼编码的设计与应用 问题需求分析 用哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式&#xff0c;哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长…

移动应用开发实例_物联网改变移动应用开发的4种方式

图片来源&#xff1a;pixabay.com来源&#xff1a;物联之家网(iothome.com)转载请注明来源&#xff01;物联网改变了移动应用程序的开发格局。那么&#xff0c;为物联网开发移动应用程序有何不同&#xff1f;物联网与移动应用程序开发齐头并进。物联网改变了人类与机器的互动方…